#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QObject>
#include <QLabel>
#include <QRandomGenerator>
#include<QAudioOutput>
#include<QSoundEffect>
#include<QSound>
#include<QUrl>
#include<QMap>
#include <QMediaContent>
#include <QSoundEffect>
#include <QTimer>
#include <QFont>
#include <QPoint>
#include <QString>
#include <QPainter>
#include <QMessageBox>
#include <QElapsedTimer>
//#include <QSound>
#include <QtCore/QCoreApplication>
#include <QtMultimedia/QMediaPlayer>
#include <QIcon>
#include <QBitmap>
#include <QProcess>
#include<QMap>
#include <vector>
//#include <ctime>
//#include <cmath>
//#include <cstdlib>
// #include <math.h>
#include "ball.h"


class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    int status;                 //用来记录游戏进行的状态  0为未开始  1为开始  2为物块下落
    QPoint mouse;               //记录鼠标坐标
    Ball unfallingBall;         //未下落且跟着鼠标走的球
    std::vector <Ball> balls;   //存放场上所有的球
    QPushButton *Start;         //开始按钮
    QPushButton *Rank;          //积分榜按钮
    QPushButton *Exit;          //退出按钮
    QPushButton *Back;          //返回按钮
    QPushButton *Pause;         //暂停按钮
    QPushButton *Finish;        //结束按钮
    QPushButton *Win;           //胜利按钮
    QLabel *q;                  //显示积分
    int gamescore{0};           //游戏积分
    QString str;                //显示积分的字符串
    QPushButton *maxPicture;    //当前最大的小动物


    // 背景类型
    enum BACKGROUND{
        NORMAL,
        TYPE1,
        TYPE2,
        TYPE3,
        TYPE4,
        TYPE5,
        TYPE6,
        TYPE7,
        TYPE8,
        TYPE9,
        TYPE10
    };

    long long int time1;            //记录扔球的时间间隔
    double K{0.2};                  //碰撞系数
    const double speedlimit{10.0};  //速度上限
    double X0,Y0;                   //鼠标的初始位置
    const int HEIGHT{760};          //界面高度
    const int WIDTH{460};           //界面宽度
    const int TOPLINE{80};          //顶部高度
    //状态status常量
    const int CLEAR{2};             //清空
    const int START{1};             //开始
    const int STOP{0};              //停止
    const int SHOW1{3};             //显示
    const int BOOM{4};              //爆炸
    const int WIN{5};               //胜利
    BACKGROUND background{NORMAL};  //背景类型
    int maxBallSize{0};             //最大球的大小

    auto setButton(QPushButton *,int width,int height,int x,int y,QString)->void;   //初始化按钮格式1
    auto setButton(QPushButton *,int width,int height,int x,int y,int a)->void;     //初始化按钮格式2
    auto initUI()->void;                                                            //初始化界面
    auto iniSignals()->void;                                                        //信号连接
    auto nextBall()->void;                                                          //下一个球初始化
    auto moveCoordinate()->void;                                                    //根据球当前的速度与碰撞状态改变所有球的坐标
    auto collideWall(int i)->void;                                                  //判断是否撞墙并改变速度方向
    auto collision()->void;                                                         //判断所有球两两之间是否相撞并改变速度的大小和方向
    auto combine(int i,int j)->void;                                                //合并两个球
    auto onRestart()->void;                                                         //重新开始游戏

//private slots:
    auto showButtons(bool)->void;                                                   //控制初始界面按钮的显示
    auto startGame(bool)->void;                                                     //开始游戏
    auto showScore()->void;                                                         //显示积分
    auto back()->void;                                                              //返回到主界面
    auto gamePause()->void;                                                         //游戏暂停
    auto gameFinish()->void;                                                        //游戏结束
    auto gameWin()->void;                                                           //游戏胜利

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    auto paintEvent(QPaintEvent *event)->void override;                             //重载绘图事件
    auto mouseMoveEvent(QMouseEvent *event)->void override;                         //重载鼠标移动事件
    auto mousePressEvent(QMouseEvent *event)->void override;                        //重载点击事件
    auto timerEvent(QTimerEvent *event)->void override;                             //重载计时器事件
};
#endif // MAINWINDOW_H
